home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 5 / MacMania 5.toast / / Internet software / NewsWatcher / NW Source / Source / aevt.c < prev    next >
Text File  |  1997-01-09  |  13KB  |  471 lines

  1. /*----------------------------------------------------------------------------
  2.  
  3.     aevt.c
  4.  
  5.     This module handles Apple events.
  6.     
  7.     Copyright © 1994-1997, Northwestern University.
  8.  
  9. ----------------------------------------------------------------------------*/
  10.  
  11. #include <stdio.h>
  12.  
  13. #include "glob.h"
  14. #include "aevt.h"
  15. #include "dialog.h"
  16. #include "newsrc.h"
  17. #include "memutil.h"
  18. #include "message.h"
  19. #include "group.h"
  20. #include "newswatcher.h"
  21. #include "status.h"
  22. #include "full.h"
  23. #include "subscribe.h"
  24. #include "print.h"
  25. #include "windutil.h"
  26. #include "wind.h"
  27. #include "url.h"
  28.  
  29.  
  30.  
  31. #define kInitialGroupsResId        200            /* STR# resource id of intial group list
  32.                                                customization resource */
  33.  
  34. #define kOpenPrefsFileDlg                156
  35. #define kOpenPrefsFileDlgQuitItem        1
  36.  
  37.  
  38.  
  39. static AppleEvent *gFirstEvent;
  40. static AppleEvent *gFirstReply;
  41.  
  42. static AEEventHandlerUPP gHandleOAPPUPP;
  43. static AEEventHandlerUPP gHandleODOCUPP;
  44. static AEEventHandlerUPP gHandlePDOCUPP;
  45. static AEEventHandlerUPP gHandleQUITUPP;
  46. static AEEventHandlerUPP gHandleGURLUPP;
  47. static AEEventHandlerUPP gHandleFirstEventUPP;
  48.  
  49.  
  50.  
  51. /*----------------------------------------------------------------------------
  52.     MyGotRequiredParams 
  53.     
  54.     Check for unexpected required parameters. See NIM:IAC 4-35.
  55.     
  56.     Entry:    event = pointer to event.
  57.     
  58.     Exit:    function result = error code (errAEParamMissed if unexpected
  59.                 required parameter).
  60. ----------------------------------------------------------------------------*/
  61.  
  62. static OSErr MyGotRequiredParams (AppleEvent *event)
  63. {
  64.     OSErr err = noErr;
  65.     DescType returnedType;
  66.     Size actualSize;
  67.     
  68.     err = AEGetAttributePtr(event, keyMissedKeywordAttr, typeWildCard,
  69.         &returnedType, nil, 0, &actualSize);
  70.     return err == errAEDescNotFound ? noErr : errAEParamMissed;
  71. }
  72.  
  73.  
  74.  
  75. /*----------------------------------------------------------------------------
  76.     HandleOAPP 
  77.     
  78.     Handle the open application event.
  79. ----------------------------------------------------------------------------*/
  80.  
  81. static pascal OSErr HandleOAPP (AppleEvent *event, AppleEvent *reply, long refcon)
  82. {
  83.     WindowPtr wind;
  84.     OSErr err = noErr;
  85.     Boolean addingInitialSubscribedGroupsStatusMesageDisplayed = false;
  86.     short i;
  87.     Str255 groupName;
  88.     long nameOffset;
  89.  
  90.     err = MyGotRequiredParams(event);
  91.     if (err != noErr) goto exit;
  92.     if (gStartingUp) {
  93.         if (gPrefs.autoFetchNewsrc) return noErr;
  94.         err = MakeNewUntitledUserGroupWindow(&wind);
  95.         if (err != noErr) goto exit;
  96.         SendBehind(wind, nil);
  97.         if (!gPrefsFileFoundAtStartup) {
  98.             i = 1;
  99.             while (true) {
  100.                 *groupName = 0;
  101.                 GetIndString(groupName, kInitialGroupsResId, i);
  102.                 if (*groupName == 0) break;
  103.                 if (!addingInitialSubscribedGroupsStatusMesageDisplayed) {
  104.                     err = DisplayStatusMessageNumber(kStrAddingInitialSubscribedGroups);
  105.                     if (err != noErr) goto exit;
  106.                     addingInitialSubscribedGroupsStatusMesageDisplayed = true;
  107.                 }
  108.                 p2cstr(groupName);
  109.                 nameOffset = FindGroupOffset((char*)groupName);
  110.                 if (nameOffset != -1) {
  111.                     err = AddNewGroup(nameOffset, wind, kMaxLong, nil, false);
  112.                     if (err != noErr) goto exit;
  113.                 }
  114.                 i++;
  115.             }
  116.             err = DoZoom(wind, inZoomOut);
  117.             if (err != noErr) goto exit;
  118.         }
  119.         return noErr;
  120.     } else {
  121.         if (!gStartupOK) return userCanceledErr;
  122.         return MakeNewUntitledUserGroupWindow(&wind);
  123.     }
  124.     
  125. exit:
  126.     
  127.     ReportSystemError(err);
  128.     return err;
  129. }
  130.  
  131.  
  132.  
  133. /*----------------------------------------------------------------------------
  134.     HandleODOC 
  135.     
  136.     Handle the open document event.
  137. ----------------------------------------------------------------------------*/
  138.  
  139. static pascal OSErr HandleODOC (AppleEvent *event, AppleEvent *reply, long refcon)
  140. {
  141.     OSErr err = noErr;
  142.     AEDescList docList = {0, nil};
  143.     long numItems, i;
  144.     AEKeyword keywd;
  145.     DescType returnedType;
  146.     Size actualSize;
  147.     FSSpec fSpec;
  148.     FInfo fndrInfo;
  149.     DialogPtr dlg;
  150.     short item;
  151.     WindowPtr wind;
  152.     
  153.     if (!gStartupOK) return userCanceledErr;
  154.     err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
  155.     if (err != noErr) goto exit;
  156.     err = MyGotRequiredParams(event);
  157.     if (err != noErr) goto exit;
  158.     err = AECountItems(&docList, &numItems);
  159.     if (err != noErr) goto exit;
  160.     for (i = 1; i <= numItems; i++) {
  161.         err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
  162.             (Ptr)&fSpec, sizeof(fSpec), &actualSize);
  163.         if (err != noErr) goto exit;
  164.         err = FSpGetFInfo(&fSpec, &fndrInfo);
  165.         if (err != noErr) goto exit;
  166.         if (fndrInfo.fdType == kPrefsFileType && !gStartingUp) goto exit1;
  167.         if (fndrInfo.fdType == kSavedUserGroupListFileType) {
  168.             err = OpenUserGroupListFile(&fSpec);
  169.         } else if (fndrInfo.fdType == kSavedMessageFileType) {
  170.             err = OpenMessageFile(&fSpec, &wind);
  171.         }
  172.         if (err != noErr) goto exit;
  173.     }
  174.     err = AEDisposeDesc(&docList);
  175.     if (err != noErr) goto exit;
  176.     return noErr;
  177.  
  178. exit:
  179.  
  180.     if (docList.dataHandle != nil) AEDisposeDesc(&docList);
  181.     ReportSystemError(err);
  182.     return err;
  183.  
  184. exit1:
  185.  
  186.     if (docList.dataHandle != nil) AEDisposeDesc(&docList);
  187.     err = MyGetNewDialog(kOpenPrefsFileDlg, kOpenPrefsFileDlgQuitItem, cancel, &dlg);
  188.     if (err != noErr) return err;
  189.     SysBeep(0);
  190.     MyModalDialog(dlg, gDialogFilterUPP, &item);
  191.     err = DoClose(dlg);
  192.     if (err != noErr) return err;
  193.     if (item == kOpenPrefsFileDlgQuitItem) gDone = true;
  194.     return userCanceledErr;
  195. }
  196.  
  197.  
  198.  
  199. /*----------------------------------------------------------------------------
  200.     HandlePDOC 
  201.     
  202.     Handle the print document event.
  203. ----------------------------------------------------------------------------*/
  204.  
  205. static pascal OSErr HandlePDOC (AppleEvent *event, AppleEvent *reply, long refcon)
  206. {
  207.     OSErr err = noErr;
  208.     AEDescList docList = {0, nil};
  209.     long numItems, i;
  210.     AEKeyword keywd;
  211.     DescType returnedType;
  212.     Size actualSize;
  213.     FSSpec fSpec;
  214.     FInfo fndrInfo;
  215.     WindowPtr wind;
  216.     TWindow **info;
  217.     TEHandle theTE;
  218.     Handle text;
  219.     CStr255 title;
  220.     long start, end;
  221.     Boolean firstFile = true;
  222.     
  223.     if (!gStartupOK) return userCanceledErr;
  224.     wind = MyFrontWindow();
  225.     if (GetMyWindowKind(wind) == kStatus) DoClose(wind);
  226.     err = AEGetParamDesc(event, keyDirectObject, typeAEList, &docList);
  227.     if (err != noErr) goto exit;
  228.     err = MyGotRequiredParams(event);
  229.     if (err != noErr) goto exit;
  230.     err = AECountItems(&docList, &numItems);
  231.     if (err != noErr) goto exit;
  232.     for (i = 1; i <= numItems; i++) {
  233.         err = AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,
  234.             (Ptr)&fSpec, sizeof(fSpec), &actualSize);
  235.         if (err != noErr) goto exit;
  236.         err = FSpGetFInfo(&fSpec, &fndrInfo);
  237.         if (err != noErr) goto exit;
  238.         if (fndrInfo.fdType == kSavedMessageFileType) {
  239.             err = OpenMessageFile(&fSpec, &wind);
  240.             if (err != noErr) goto exit;
  241.             HandleUpdate(wind);
  242.             if (firstFile) {
  243.                 err = StartPrint();
  244.                 if (err != noErr) goto exit;
  245.                 err = DisplayStatusMessageNumber(kStrPrinting);
  246.                 if (err != noErr) goto exit;
  247.                 firstFile = false;
  248.             }
  249.             GetWTitle(wind, (StringPtr)title);
  250.             p2cstr((StringPtr)title);
  251.             info = (TWindow**)GetWRefCon(wind);
  252.             theTE = (**info).theTE;
  253.             text = (**theTE).hText;
  254.             start = 0;
  255.             end = MyGetHandleSize(text);
  256.             err = PrintText(text, start, end, title);
  257.             if (err != noErr) goto exit;
  258.             err = DoClose(wind);
  259.             if (err != noErr) goto exit;
  260.         }
  261.     }
  262.     err = AEDisposeDesc(&docList);
  263.     if (err != noErr) goto exit;
  264.     return noErr;
  265.  
  266. exit:
  267.  
  268.     if (docList.dataHandle != nil) AEDisposeDesc(&docList);
  269.     ReportSystemError(err);
  270.     return err;
  271. }
  272.  
  273.  
  274.  
  275. /*----------------------------------------------------------------------------
  276.     HandleQUIT 
  277.     
  278.     Handle the quit application event.
  279. ----------------------------------------------------------------------------*/
  280.  
  281. static pascal OSErr HandleQUIT (AppleEvent *event, AppleEvent *reply, long refcon)
  282. {
  283.     OSErr err = noErr;
  284.  
  285.     err = MyGotRequiredParams(event);
  286.     if (err != noErr) return err;
  287.     gDone = true;
  288.     return noErr;
  289. }
  290.  
  291.  
  292.  
  293. /*----------------------------------------------------------------------------
  294.     HandleGURL 
  295.     
  296.     Handle the get url event.
  297. ----------------------------------------------------------------------------*/
  298.  
  299. static pascal OSErr HandleGURL (AppleEvent *event, AppleEvent *reply, long refcon)
  300. {
  301.     CStr255 url;
  302.     DescType typeCode;
  303.     Size actualSize;
  304.     OSErr err = noErr;
  305.     OSErr result = noErr;
  306.  
  307.     if (!gStartupOK) return userCanceledErr;
  308.     err = AEGetParamPtr(event, keyDirectObject, typeChar, &typeCode, url, 
  309.         255, &actualSize);
  310.     if (err != noErr) return err;
  311.     err = MyGotRequiredParams(event);
  312.     if (err != noErr) return err;
  313.     url[actualSize] = 0;
  314.     result = OpenURLString(url);
  315.     if (reply->dataHandle != nil) {
  316.         err = AEPutParamPtr(reply, keyDirectObject, typeShortInteger,
  317.             &result, sizeof(result));
  318.         if (err != noErr) return err;
  319.     } else {
  320.         switch (result) {
  321.             case paramErr:
  322.                 ErrorMessageNumber(kStrURLSyntaxError);
  323.                 break;
  324.             case fnfErr:
  325.                 NoteMessageNumber(kStrArticleOrGroupNotFound);
  326.                 break;
  327.             default:
  328.                 ReportSystemError(result);
  329.                 break;
  330.         }
  331.     }
  332.     return noErr;
  333. }
  334.  
  335.  
  336.  
  337. /*----------------------------------------------------------------------------
  338.     HandleFirstEvent 
  339.     
  340.     Handle the first event.
  341. ----------------------------------------------------------------------------*/
  342.  
  343. static pascal OSErr HandleFirstEvent (AppleEvent *event, AppleEvent *reply, long refcon)
  344. {
  345.     *gFirstEvent = *event;
  346.     *gFirstReply = *reply;
  347.     return AESuspendTheCurrentEvent(event);
  348. }
  349.  
  350.  
  351.  
  352. /*----------------------------------------------------------------------------
  353.     InitializeAppleEvents 
  354.     
  355.     Initialize Apple events. Get the first event and suspend it. The caller 
  356.     must resume this first event to actually process it when initialization
  357.     is complete.
  358.     
  359.     Exit:    funtion result = error code.
  360.             firstEvent = event record for first event.
  361.             firstReply = reply record for first event.
  362. ----------------------------------------------------------------------------*/
  363.  
  364. OSErr InitializeAppleEvents (AppleEvent *firstEvent, AppleEvent *firstReply)
  365. {
  366.     OSErr err = noErr;
  367.     Boolean gotEvt;
  368.     EventRecord ev;
  369.     
  370.     gFirstEvent = firstEvent;
  371.     gFirstReply = firstReply;
  372.  
  373.     gHandleOAPPUPP = NewAEEventHandlerProc(HandleOAPP);
  374.     gHandleODOCUPP = NewAEEventHandlerProc(HandleODOC);
  375.     gHandlePDOCUPP = NewAEEventHandlerProc(HandlePDOC);
  376.     gHandleQUITUPP = NewAEEventHandlerProc(HandleQUIT);
  377.     gHandleGURLUPP = NewAEEventHandlerProc(HandleGURL);
  378.     gHandleFirstEventUPP = NewAEEventHandlerProc(HandleFirstEvent);
  379.  
  380.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
  381.         gHandleFirstEventUPP, 0, false);
  382.     if (err != noErr) return err;
  383.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
  384.         gHandleFirstEventUPP, 0, false);
  385.     if (err != noErr) return err;
  386.     err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
  387.         gHandleFirstEventUPP, 0, false);
  388.     if (err != noErr) return err;
  389.     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
  390.         gHandleFirstEventUPP, 0, false);
  391.     if (err != noErr) return err;
  392.     err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
  393.         gHandleFirstEventUPP, 0, false);
  394.     if (err != noErr) return err;
  395.  
  396.     while (true) {
  397.         gotEvt = WaitNextEvent(highLevelEventMask | activMask | updateMask | osMask, 
  398.             &ev, GetCaretTime(), nil);
  399.         if (gotEvt && ev.what == kHighLevelEvent) {
  400.             err = AEProcessAppleEvent(&ev);
  401.             if (err != noErr) return err;
  402.             break;
  403.         }
  404.         if (gotEvt) HandleEvent(&ev);
  405.     }
  406.     
  407.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication,
  408.         gHandleOAPPUPP, 0, false);
  409.     if (err != noErr) return err;
  410.     err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
  411.         gHandleODOCUPP, 0, false);
  412.     if (err != noErr) return err;
  413.     err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments,
  414.         gHandlePDOCUPP, 0, false);
  415.     if (err != noErr) return err;
  416.     err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication,
  417.         gHandleQUITUPP, 0, false);
  418.     if (err != noErr) return err;
  419.     err = AEInstallEventHandler(kGetURLEventClass, kGetURLEventID,
  420.         gHandleGURLUPP, 0, false);
  421.     return err;
  422. }
  423.  
  424.  
  425.  
  426. /*----------------------------------------------------------------------------
  427.     MyAEProcessAppleEvent 
  428.     
  429.     Process an Apple event.
  430.     
  431.     Entry:    ev = pointer to event record.
  432.     
  433.     Exit:    funtion result = error code.
  434. ----------------------------------------------------------------------------*/
  435.  
  436. OSErr MyAEProcessAppleEvent (EventRecord *ev)
  437. {
  438.     OSErr err = noErr;
  439.     
  440.     gAEServer = true;
  441.     err = AEProcessAppleEvent(ev);
  442.     gAEServer = false;
  443.     return err;
  444. }
  445.  
  446.  
  447.  
  448. /*----------------------------------------------------------------------------
  449.     MyAEResumeTheCurrentEvent 
  450.     
  451.     Resume processing an Apple event.
  452.     
  453.     Entry:    event = pointer to event record.
  454.             reply = pointer to reply record.
  455.             dispatcher = pointer to event handler.
  456.             handlerRefcon = refcon.
  457.     
  458.     Exit:    funtion result = error code.
  459. ----------------------------------------------------------------------------*/
  460.  
  461. OSErr MyAEResumeTheCurrentEvent (AppleEvent *event, AppleEvent *reply,
  462.     AEEventHandlerUPP dispatcher, long handlerRefCon)
  463. {
  464.     OSErr err = noErr;
  465.     
  466.     gAEServer = true;
  467.     err = AEResumeTheCurrentEvent(event, reply, dispatcher, handlerRefCon);
  468.     gAEServer = false;
  469.     return err;
  470. }
  471.